package com.ly.dingTalk.bean.user;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import com.google.gson.annotations.JsonAdapter;
import com.ly.dingTalk.util.json.DateToStrAdapter;
import com.ly.dingTalk.util.json.DeptIdsToStrAdapter;
import com.ly.dingTalk.util.json.GsonHelper;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * 用户信息.
 */
@Data
@Accessors(chain = true)
public class DtUserV2 implements Serializable {
    private static final long serialVersionUID = -5696099236344075582L;

    private String userid;
    // 员工在当前开发者企业账号范围内的唯一标识。
    private String unionid;
    private String name;
    // 头像 员工使用默认头像，不返回该字段，手动设置头像会返回。
    private String avatar;
    private String mobile;
    // 是否号码隐藏
    private Boolean hide_mobile;
    // 	分机号
    private String telephone;
    // 员工工号。
    private String job_number;
    // title
    private String title;
    private String email;
    // 办公地点。
    private String work_place;
    private String remark;
    private List<DepartLeader> leader_in_dept;
    
    /**
     * 所属部门ID列表
     */
    @JsonAdapter(value = DeptIdsToStrAdapter.class)
    private List<Long> dept_id_list;
    /**
     * 员工在对应的部门中的排序
     */
    private List<DepartOrder> dept_order_list;
    private List<UserRole> role_list;
    // 员工在对应的部门中的职位。
    private List<DeptTitle> dept_title_list;
    private UnionEmpExt union_emp_ext;
    private String extension;
    private String manager_userid;
    @JsonAdapter(value = DateToStrAdapter.class)
    private Date hiredDate;
    // 是否激活了钉钉
    private Boolean active;
    private Boolean real_authed;
    // 是否为企业的高管
    private Boolean senior;
    /**
     * 是否开启高管模式，默认值false。
     *  开启后，手机号码对所有员工隐藏。
     *  普通员工无法对其发DING、发起钉钉商务电话。
     *  高管之间可以发DING、发起钉钉商务电话。
     */
    private Boolean senior_mode;
    // 是否为企业的管理员
    private Boolean admin;
    // 是否为企业的老板
    private Boolean boss;
    // 是否为专属帐号
    private Boolean exclusiveAccount;
    // 员工的企业邮箱，长度最大100个字符。
    private String org_email;
    // 员工的企业邮箱类型。 profession: 标准版 base：基础版
    private String org_email_type;
    // 登录邮箱。仅适用于邮箱账号，非邮箱账号设置该字段不生效。
    private String login_email;
    // 入职时间
    private Date hired_date;
    private String state_code;
    @JsonAdapter(value = DateToStrAdapter.class)
    private Date create_time;


    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class DepartOrder {
        private Long dept_id;
        private Long order;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class DepartLeader {
        private Long dept_id;
        private Boolean leader;
    }
    
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class DeptTitle {
        // 部门ID。
        private Long dept_id;
        // 员工在部门中的职位。
        private String title;
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UserRole {
        private Long id;
        private String name;
        private String group_name;
    }
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UnionEmpExt {
    	private String userid;
    	private List<UnionEmpMapExt> union_emp_map_list;
    	private String corp_id;
    	
        @Data
        @Builder
        @NoArgsConstructor
        @AllArgsConstructor
        public static class UnionEmpMapExt {
        	private String userid;
        	private String corp_id;
        }
    }

    public static DtUserV2 fromJson(String json) {
    	return GsonHelper.create().fromJson(json, DtUserV2.class);
    }
    
    public String toJson() {
		return GsonHelper.create().toJson(this);
	}
}
